import { ResultType, ResultUtil } from '@xtail/result'
import { DB, PouchDBFindOptionsType } from '../classes'

/**
 * 根据 id 删除数据库中的文档
 *
 * @param {DB} db 数据库实例
 * @param {string} id 需要删除的文档的 id
 * @returns {Promise<ResultType>} 删除结果
 */
export const removeById = async (db: DB, id: string): Promise<ResultType> => {
  try {
    const res = await db.removeById(id)
    return ResultUtil.genResult({
      status: res.ok,
      message: res.ok ? '删除成功' : '删除失败',
      data: res
    })
  } catch (err: any) {
    return ResultUtil.genFailResult(err?.message ?? '删除失败', err)
  }
}

export type RemoveByIdType = typeof removeById

/**
 * 根据 id 批量删除数据库中的文档
 *
 * @param {DB} db 数据库实例
 * @param {string[]} ids 需要删除的文档的 id 列表
 * @returns {Promise<ResultType>} 删除结果
 */
export const removeByIds = async (db: DB, ids: string[]): Promise<ResultType> => {
  try {
    const res = await db.removeByIds(ids)
    return ResultUtil.genResult({
      status: res.every(item => Reflect.get(item, 'ok')),
      message: res.every(item => Reflect.get(item, 'ok')) ? '删除成功' : '存在删除失败数据项',
      data: res
    })
  } catch (err: any) {
    return ResultUtil.genFailResult(err?.message ?? '删除失败', err)
  }
}

export type RemoveByIdsType = typeof removeByIds

/**
 * 根据条件批量删除数据库中的文档
 *
 * @param {DB} db 数据库实例
 * @param {PouchDBFindOptionsType} options 要删除数据的查询配置选项
 * @returns {Promise<ResultType>} 删除结果
 */
export const remove = async (db: DB, options: PouchDBFindOptionsType = {}): Promise<ResultType> => {
  try {
    const res = await db.remove(options)
    return ResultUtil.genResult({
      status: res.every(item => Reflect.get(item, 'ok')),
      message: res.every(item => Reflect.get(item, 'ok')) ? '删除成功' : '存在删除失败数据项',
      data: res
    })
  } catch (err: any) {
    return ResultUtil.genFailResult(err?.message ?? '删除失败', err)
  }
}

export type RemoveType = typeof remove
